package condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
import condominio.modelo.TipoVivienda;
import condominio.modelo.Usuario;
import condominio.modelo.Vivienda;
import condominio.util.ConexionBD;

public class ViviendaDAO extends BaseDAO{

	
	public Collection<Vivienda> listar() throws DAOExcepcion {
		//System.out.println("VivendaDAO: listar()");
		Collection<Vivienda> c = new ArrayList<Vivienda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			
			con = ConexionBD.obtenerConexion();
			String query = "select idVivienda,ubicacion,metraje,tipo,fechaRegistro,idResidente from viviendas";
		stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Vivienda vo = new Vivienda();
				
				Usuario residente = new Usuario();
				residente.setIdUsuario(Integer.parseInt(rs.getString("idResidente")));
				
				TipoVivienda tipovivienda = new TipoVivienda();
				tipovivienda.setIdTipoVivienda(Integer.parseInt(rs.getString("tipo")));
				
				//seteamos la vivienda
				vo.setIdVivienda(Integer.parseInt(rs.getString("idVivienda")));
				vo.setUbicacion(rs.getString("ubicacion"));
				vo.setMetraje(rs.getString("metraje"));

				vo.setTipovivienda(tipovivienda);
				
				vo.setFechaRegistro(rs.getString("fechaRegistro"));
				vo.setResidente(residente);
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	
}
	
	public void insertar(Vivienda vo) throws DAOExcepcion {
		System.out.println("ViviendaDAO: insertar(Vivienda vo)");
		String query = "INSERT INTO viviendas(ubicacion, metraje,idResidente,tipo,numero,fechaRegistro) VALUES (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getUbicacion());
			stmt.setString(2, vo.getMetraje());
			stmt.setInt(3, vo.getResidente().getIdUsuario());
			stmt.setInt(4, vo.getTipovivienda().getIdTipoVivienda());
			stmt.setString(5, vo.getNumero());
			stmt.setString(6, vo.getFechaRegistro());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Vivienda> buscarPorNumero(String numeroVivienda) throws DAOExcepcion {
		System.out.println("ViviendaDAO: buscarPorNumeroVivienda(String numero)");
		String query = 
				"SELECT idVivienda,ubicacion, numero, metraje," 
				+" tipovivienda.DescripcionTipoVivienda as tipo," 
				+" CONCAT_ws(' ', usuarios.Nombre,usuarios.ApellidoPaterno ,usuarios.ApellidoMaterno) As idResidente"
				+" FROM viviendas Inner join tipovivienda"
				+" On viviendas.tipo = tipovivienda.idTipoVivienda"
				+" Inner Join usuarios"
				+" On viviendas.idResidente = usuarios.idUsuario"
				+ " WHERE numero like ?"
				+ "order by idVivienda";
		Collection<Vivienda> lista = new ArrayList<Vivienda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + numeroVivienda + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Vivienda vo = new Vivienda();
				
				Usuario residente = new Usuario();
				//residente.setIdUsuario(Integer.parseInt(rs.getString("idResidente")));
				residente.setNombre(rs.getString("idResidente"));
				
				TipoVivienda tipovivienda = new TipoVivienda();
				//tipovivienda.setIdTipoVivienda(Integer.parseInt(rs.getString("tipo")));
				tipovivienda.setDescripcionTipoVivienda(rs.getString("tipo"));
				
				vo.setIdVivienda(rs.getInt("idVivienda"));
				vo.setUbicacion(rs.getString("ubicacion"));
				vo.setNumero(rs.getString("numero"));
				vo.setMetraje(rs.getString("metraje"));
				vo.setTipovivienda(tipovivienda);
				vo.setResidente(residente);
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public void eliminar(int CodigoVivienda) throws DAOExcepcion {
		System.out.println("ViviendaDAO: eliminar(int CodigoVivienda)");
		String query = "DELETE FROM condominio.Viviendas WHERE idvivienda=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, CodigoVivienda);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizar(Vivienda vo) throws DAOExcepcion {
		System.out.println("ViviendaDAO: actualizar(Vivienda vo)");
		String query = "update Viviendas set metraje=? where idvivienda=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getMetraje());
			stmt.setInt(2, vo.getIdVivienda());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Vivienda obtener(int CodigoVivienda) throws DAOExcepcion {
		System.out.println("ViviendaDAO: obtener(Int CodigoVivienda)");
		Vivienda vo = new Vivienda();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idvivienda, metraje from condominio.Viviendas where idvivienda=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, CodigoVivienda);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdVivienda(rs.getInt(1));
				vo.setMetraje(rs.getString(2));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}


	
	
}

